library(plotly)

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
#########################################################################
###############function to create data set 2
cd1 <- function() {
    
    t <- c(rep(0,100), rep(1,100))
    x1 <- runif(200, 0,5) + t
    x2 <- runif(200, 0,5) + t
    x3 <- rep(c(rep("A",25), rep("B",25),rep("C",25), rep("D",25)),2)
    # t <- c(rep("C",100),rep("T",100))
    y <- 2*t + x1 + x2 #+ rnorm(200)

    d <- list(x1=x1,x2=x2,x3=x3,t=t,y=y) %>% as.data.frame()

    return(d)
}


dists <- function(data, form.t=NULL, model.t=NULL, form.y=NULL, model.y=NULL) {
    
    #get the response variable from the formula
    t = all.vars(form.t)[1]
    
    #check the response is binary for logistic regression
    if(all(as.numeric(data[t] == data[1,t]) %in% c(0,1))) {
        data[t] <- as.numeric(data[t] != data[1,t])
    }
    
    #calculate the propensity score using logistic regression
    if (is.null(model.t)){
        prop.s <- glm(form.t, data=data, family = "binomial") %>% fitted()
    }
    
    
    
    dt <- cbind(idx= str_pad(row.names(data), nchar(nrow(data)), pad = "0"), data, prop.s)
    
    dt <- dt %>% mutate(prop.wt=ifelse(t==1, 1/prop.s,1/(1-prop.s)))
    
    Q <- quantile(dt$prop.s, prob=seq(from=0,to=1,by=0.2),na.rm=TRUE)
    dt$prop.st <- cut(dt$prop.s, breaks = Q, labels = 1:5, include.lowest = TRUE)
    
    return(dt)
}

d1 <- dists(form.t=t ~ x1 + x2, data=cd1())


# a <- glm(t ~ x1 + x2, data=d1, family = "binomial") 
# m1 <- glm(ifelse(t=="C",0,1)~x1+x3, data=d1)
# a$model
# 
# all.vars(a$terms)
# 
# lm(y~t, data = d1)
# lm(y~t, weights = d1$prop.w, data = d1)
# 
# 
# summary(d1$prop.s)
# 
# typeof(a)

# a %>% predict(newdata=d1, type = "response") == a$fitted.values

data <- cd1()

ggplot(data, aes(x1, x2, color=t)) + geom_point() 

NA
NA
NA
NA
matches <- dist.matches(f=f, data=mdata)
Error in dist.matches(f = f, data = mdata) : 
  unused arguments (f = f, data = mdata)

Line <-  gvisScatterChart(data[c("x1","x2", "t")],
                       options=list(
                         legend="right",
                         title="Hello World",
                         titleTextStyle="{color:'red',
                                           fontName:'Courier',
                                           fontSize:16}",
                         backgroundColor="#D3D3D3",
                         vAxis="{gridlines:{color:'red', count:3}}",
                         hAxis="{title:'X1', titleTextStyle:{color:'blue'}}",
                         series="[{color:'green', targetAxisIndex: 0},
                                   {color: 'orange',targetAxisIndex:1}]",
                         vAxes="[{title:'val1'}, {title:'val2'}]",
                         legend="bottom",
                         curveType="function",
                         width=500,
                         height=500
                       ), chartid = 55555)
plot(Line)

df <- gapminder 

fig <- mdata %>%

  plot_ly(

    x = ~x1, 

    y = ~x2, 

    # size = ~pop, 

    color = ~c("No","Yes")[factor(t)], 
    
    # text = ~color,

    frame = ~prop.st,

    # text = paste0(round(~x1,2), ", ",round(~x2,2)),
    
    hovertemplate = '%{color}: %{x:.2f}, %{y:.2f}<extra></extra>',

    # hoverinfo = "text",

    type = 'scatter',

    mode = 'markers'

  )

# fig <- fig %>% layout(
# 
#     xaxis = list(
# 
#       type = "log"
# 
#     )
# 
#   )


print(fig)
Warning in RColorBrewer::brewer.pal(N, "Set2") :
  minimal value for n is 3, returning requested palette with 3 different levels

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  minimal value for n is 3, returning requested palette with 3 different levels

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  minimal value for n is 3, returning requested palette with 3 different levels

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  minimal value for n is 3, returning requested palette with 3 different levels
NULL
```r
f1 <- y ~ x2 * x1 * I(x1*x2) * I(x1^2) * I(x2^2) * I(x1^2*x2) * I(x1*x2^2) * I(x1^3) * I(x2^3)

output <- NULL


f1.t <- paste(f1[[2]],f1[[1]],\t\,c(\\,paste(\+\,labels(terms(f1)))))

# f1.t <- \y ~ t + x1 + x2\

# f1.t <- str_replace_all(f1.t, \:\, \+\)


f1.l <- lapply(f1.t,function(x) lm(x, data=d1))

# f1.s <- sapply(f1.t,function(x) lm(x, data=d1, weights= d1$prop.wt))

f1.est <- sapply(1:length(f1.l), function(x) f1.l[[c(x,1,2)]])

output <- rbind(output, cbind(mod=\Vanilla\,var=var(f1.est),max=max(f1.est), av=mean(f1.est)))

plot(f1.est, type = \l\)

# [1] 0.03991049
# [1] 4.200924

f1.l <- lapply(f1.t,function(x) lm(x, data=d1, weights= d1$prop.wt))

# f1.s <- sapply(f1.t,function(x) lm(x, data=d1, weights= d1$prop.wt))

f1.est <- sapply(1:length(f1.l), function(x) f1.l[[c(x,1,2)]])



# var(f1.est)  #[[1]][2]
# max(f1.est)  #[[1]][2]

output <- rbind(output, cbind(\Weighted\,var(f1.est), max(f1.est), 
                              av=mean(f1.est)))
plot(f1.est, type = \l\)
# [1] 0.005683825
# [1] 2.525635

v <- NULL

for (i in 1:5){
    


f1.l <- lapply(f1.t,function(x) lm(x, data=d1[d1$prop.st==i,] ))

# f1.s <- sapply(f1.t,function(x) lm(x, data=d1, weights= d1$prop.wt))

# f1.l[[98]]

f1.est <- sapply(1:length(f1.l), function(x) f1.l[[c(x,1,2)]])

v <- rbind(v,cbind(variance=var(f1.est), max=max(f1.est), av=mean(f1.est)))

}

output <- rbind(output, cbind(\Stratified\,apply(v, 2, mean)%>%t())) %>%
    as.data.frame()
# d1 %>% select(prop.st, t) %>% group_by_all() %>% mutate(n=n()) %>% unique()
plot(f1.est, type = \l\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->





<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5kZjEgPC0gZnVsbF9qb2luKGQxLGQxLGJ5PWNoYXJhY3RlcigpLHN1ZmZpeCA9IGMoXFxcXCwgXFwueVxcKSkgJT4lIGZpbHRlcih0ICE9IHQueSkgJT4lIG11dGF0ZShwLmRpc3Q9YWJzKHByb3AucyAtIHByb3Aucy55KSlcblxuXG5wLm1hdGNoZXMgPC0gTlVMTFxuIyBtLm1hdGNoZXMgPC0gTlVMTFxucC5pZHMgPC0gbGlzdChpZHg9TlVMTCxpZHgueT1OVUxMKVxuIyBtLmlkcyA8LSBsaXN0KGlkPU5VTEwsc19pZD1OVUxMKVxuXG5mb3IgKGkgaW4gMToobnJvdyhkZjEpKSkge1xuICAgIFxuICAgIGlmIChucm93KGRmMSAlPiUgZmlsdGVyKCFpZHgueSAlaW4lIHAuaWRzJGlkeC55LCAhaWR4ICVpbiUgcC5pZHMkaWR4KSkhPTApIHtcbiAgICBcbiAgICBwIDwtIGRmMSAlPiUgZmlsdGVyKCFpZHgueSAlaW4lIHAuaWRzJGlkeC55LCAhaWR4ICVpbiUgcC5pZHMkaWR4KSAlPiUgXG4gICAgICAgICAgZmlsdGVyKHAuZGlzdCA9PSBtaW4ocC5kaXN0KSkgXG4gICAgcC5tYXRjaGVzIDwtIHJiaW5kKHAubWF0Y2hlcywgcClcbiAgICBwLmlkcyA8LSBwLm1hdGNoZXNbYyhcXGlkeFxcLCBcXGlkeC55XFwpXVxuICAgIFxuICAgICMgbSA8LSBkZjMgJT4lIGZpbHRlcighc19pZCAlaW4lIG0uaWRzJHNfaWQsICFpZCAlaW4lIG0uaWRzJGlkKSAlPiUgXG4gICAgIyAgICAgICBmaWx0ZXIobS5kaXN0ID09IG1pbihtLmRpc3QpKSBcbiAgICAjIG0ubWF0Y2hlcyA8LSByYmluZChtLm1hdGNoZXMsIG0pXG4gICAgIyBtLmlkcyA8LSBtLm1hdGNoZXNbYyhcXGlkXFwsIFxcc19pZFxcKV1cbiAgICB9XG4gICAgXG59XG5cblxuZG0gPC0gYXMubWF0cml4KHAubWF0Y2hlc1ssYygneDEnLCd4MicpXS1wLm1hdGNoZXNbLGMoJ3gxLnknLCd4Mi55JyldKVxuXG4jY292YXJpYW5jZSBtYXRyaXhcbmMgPC0gY292KGQxWyxjKCd4MScsJ3gyJyldKVxuXG4jIHNvbHZlICAoY292YXJpYW5jZSBtYXRyaXgpICUqJSB4ID0gZCBmb3IgeFxuY292LmQgPC0gc2FwcGx5KDE6bnJvdyhwLm1hdGNoZXMpLCBmdW5jdGlvbih4KSBzb2x2ZShjLGRtW3gsXSkpICU+JSB0KClcblxuIyBNYWhhbGFub2JpcyBjYWxjdWxhdGlvbiBmb3JjZWQgaW4gdHdvIHN0ZXBzXG5wLm1hdGNoZXMkbS5kaXN0IDwtIGFwcGx5KGRtKmNvdi5kLCAxLCBzdW0pXG5cblxucC5tYXRjaGVzICU+JSByb3d3aXNlKCkgJT4lIFxuICAgIG11dGF0ZShhPXgxLXgxLnksIGI9eDIteDIueSxcbiAgICAgICAgICAgbS5kID0gc3VtKGMoYSxiKSpzb2x2ZShjb3YoZDFbLGMoJ3gxJywneDInKV0pLCBjKGEsYikpKSkgJT4lIHNlbGVjdCgtYSwgLWIpXG5cblxuYGBgXG5gYGAifQ== -->

```r
```r

df1 <- full_join(d1,d1,by=character(),suffix = c(\\, \.y\)) %>% filter(t != t.y) %>% mutate(p.dist=abs(prop.s - prop.s.y))


p.matches <- NULL
# m.matches <- NULL
p.ids <- list(idx=NULL,idx.y=NULL)
# m.ids <- list(id=NULL,s_id=NULL)

for (i in 1:(nrow(df1))) {
    
    if (nrow(df1 %>% filter(!idx.y %in% p.ids$idx.y, !idx %in% p.ids$idx))!=0) {
    
    p <- df1 %>% filter(!idx.y %in% p.ids$idx.y, !idx %in% p.ids$idx) %>% 
          filter(p.dist == min(p.dist)) 
    p.matches <- rbind(p.matches, p)
    p.ids <- p.matches[c(\idx\, \idx.y\)]
    
    # m <- df3 %>% filter(!s_id %in% m.ids$s_id, !id %in% m.ids$id) %>% 
    #       filter(m.dist == min(m.dist)) 
    # m.matches <- rbind(m.matches, m)
    # m.ids <- m.matches[c(\id\, \s_id\)]
    }
    
}


dm <- as.matrix(p.matches[,c('x1','x2')]-p.matches[,c('x1.y','x2.y')])

#covariance matrix
c <- cov(d1[,c('x1','x2')])

# solve  (covariance matrix) %*% x = d for x
cov.d <- sapply(1:nrow(p.matches), function(x) solve(c,dm[x,])) %>% t()

# Mahalanobis calculation forced in two steps
p.matches$m.dist <- apply(dm*cov.d, 1, sum)


p.matches %>% rowwise() %>% 
    mutate(a=x1-x1.y, b=x2-x2.y,
           m.d = sum(c(a,b)*solve(cov(d1[,c('x1','x2')]), c(a,b)))) %>% select(-a, -b)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->





<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG4jIGpvaW4oZDEscC5tYXRjaGVzLFxcXFwpXG5cbmVzdHMgPC0gTlVMTFxuYiA8LSBOVUxMXG5cbmZvciAoaSBpbiBzZXEoMSwobnJvdyhwLm1hdGNoZXMpLTkpLGJ5PTIpKXtcbiAgICBcbiAgICBkYXRhIDwtIHAubWF0Y2hlcyAlPiUgYXJyYW5nZShkZXNjKHAuZGlzdCksdCkgJT4lIC5baTpucm93KHAubWF0Y2hlcyksXVxuICAgIFxuICAgIGJhbHMgPC0gYmFsLnRhYih0IH4geDEgKyB4MiwgZGF0YSA9IGRhdGEsIFxuICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IFxccHJvcC5zXFwsIHMuZC5kZW5vbSA9IFxcdHJlYXRlZFxcKVxuXG4gICAgYiA8LSByYmluZChiLGxpc3QoeDEuYmFsID0gYmFscyRCYWxhbmNlWzIsMl0sIHgyLmJhbCA9IGJhbHMkQmFsYW5jZVsxLDJdKSAlPiUgXG4gICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgpKVxuICAgIFxuICAgIGYxLmwgPC0gbGFwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kYXRhKSlcbiAgICBcbiAgICAjIGYxLnMgPC0gc2FwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kMSwgd2VpZ2h0cz0gZDEkcHJvcC53dCkpXG4gICAgXG4gICAgIyBmMS5sW1s5OF1dXG4gICAgXG4gICAgZjEuZXN0IDwtIHNhcHBseSgxOmxlbmd0aChmMS5sKSwgZnVuY3Rpb24oeCkgZjEubFtbYyh4LDEsMildXSlcbiAgICBcbiAgICBlc3RzIDwtIHJiaW5kKGVzdHMsY2JpbmQobj1pLHZhcmlhbmNlPXZhcihmMS5lc3QpLCBtYXg9bWF4KGYxLmVzdCksIGF2PW1lYW4oZjEuZXN0KSkpXG5cbn1cblxuZXN0cyA8LSBlc3RzICU+JSBhcy5kYXRhLmZyYW1lKClcbm91dHB1dCA8LSBvdXRwdXQgJT4lIGFzLmRhdGEuZnJhbWUoKVxuXG5jb2xuYW1lcyhvdXRwdXQpPC0gYyhcXG1vZGVsXFwsIFxcdmFyc1xcLCBcXG1heC52YWxcXCwgXFxhdlxcKVxuXG5vdXRwdXQkdmFycyA8LSBvdXRwdXQkdmFycyAlPiUgYXMubnVtZXJpYygpXG5cbm91dHB1dCRtYXgudmFsIDwtIG91dHB1dCRtYXgudmFsICU+JSBhcy5udW1lcmljKClcblxuYGBgXG5gYGAifQ== -->

```r
```r

# join(d1,p.matches,\\)

ests <- NULL
b <- NULL

for (i in seq(1,(nrow(p.matches)-9),by=2)){
    
    data <- p.matches %>% arrange(desc(p.dist),t) %>% .[i:nrow(p.matches),]
    
    bals <- bal.tab(t ~ x1 + x2, data = data, 
                    distance = \prop.s\, s.d.denom = \treated\)

    b <- rbind(b,list(x1.bal = bals$Balance[2,2], x2.bal = bals$Balance[1,2]) %>% 
                   as.data.frame())
    
    f1.l <- lapply(f1.t,function(x) lm(x, data=data))
    
    # f1.s <- sapply(f1.t,function(x) lm(x, data=d1, weights= d1$prop.wt))
    
    # f1.l[[98]]
    
    f1.est <- sapply(1:length(f1.l), function(x) f1.l[[c(x,1,2)]])
    
    ests <- rbind(ests,cbind(n=i,variance=var(f1.est), max=max(f1.est), av=mean(f1.est)))

}

ests <- ests %>% as.data.frame()
output <- output %>% as.data.frame()

colnames(output)<- c(\model\, \vars\, \max.val\, \av\)

output$vars <- output$vars %>% as.numeric()

output$max.val <- output$max.val %>% as.numeric()

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2dwbG90KHAubWF0Y2hlcywgYWVzKHgxLHgyLCBjb2xvciA9IGFzLmZhY3Rvcih0KSkpICsgXG4gIGFubm90YXRlKFxccmVjdFxcLCB4bWluPTAsIHhtYXg9NSwgeW1pbj0wLCB5bWF4PTUsIGFscGhhPTAuMSwgZmlsbD1cXGJsdWVcXCkgKyBcbiAgYW5ub3RhdGUoXFxyZWN0XFwsIHhtaW49MSwgeG1heD02LCB5bWluPTEsIHltYXg9NiwgYWxwaGE9MC4xLCBmaWxsPVxccmVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKFxcYmx1ZVxcLCBcXHJlZFxcKSwgbmFtZT1cXEdyb3VwXFwsIGxhYmVscyA9IGMoXFxDb250cm9sXFwsXFxUcmVhdFxcKSkgK1xuICBnZW9tX3NlZ21lbnQoZGF0YT1wLm1hdGNoZXNbcC5tYXRjaGVzJHQ9PTAsXSxcbiAgICAgICAgICAgICAgIGFlcyh4PXgxLHhlbmQ9eDEueSx5PXgyLHllbmQ9eDIueSwgXG4gICAgICAgICAgICAgICAgICAgYWxwaGE9Y3V0KHJhbmsocC5kaXN0KSw0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygxLDIsMyw0KSkpLCBcbiAgICAgICAgICAgICAgIGNvbG9yPSBcXGJsYWNrXFwsIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjIsXFxjbVxcKSkpICtcbiAgICBzY2FsZV9hbHBoYV9kaXNjcmV0ZShuYW1lPVxcQ3V0c1xcLCBsYWJlbHM9YyhcXDFzdFxcLCBcXDJuZFxcLCBcXDNyZFxcLCBcXDR0aFxcKSwgcmFuZ2UgPSBjKDEsMC4xKSkgK1xuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9jbGFzc2ljKCkgXG5cblxuZ2dwbG90KHAubWF0Y2hlc1twLm1hdGNoZXMkdD09MCxdLCBhZXMocHJvcC5zLHByb3Aucy55LCBjb2xvcj1wLmRpc3QpKSArIFxuICBnZW9tX2FibGluZShzbG9wZT0xKSArIGdlb21fcG9pbnQoKSArIHRoZW1lX2NsYXNzaWMoKSArIGxpbXMoeD1jKDAsMSkseT1jKDAsMSkpIFxuXG5nZ3Bsb3QocC5tYXRjaGVzW3AubWF0Y2hlcyR0PT0wLF0sIGFlcyhwcm9wLnMscHJvcC53dCwgY29sb3I9cHJvcC5zdCkpICsgXG4gZ2VvbV9wb2ludChhbHBoYT0wLjcpICsgdGhlbWVfY2xhc3NpYygpIyArIGxpbXMoeD1jKDAsMSkseT1jKDAsMSkpIFxuXG5nZ3Bsb3QocC5tYXRjaGVzW3AubWF0Y2hlcyR0PT0wLF0sIGFlcyhwLmRpc3QsIG0uZGlzdCwgY29sb3I9cHJvcC5zdCkpICsgXG4gZ2VvbV9wb2ludChhbHBoYT0wLjcpICsgdGhlbWVfY2xhc3NpYygpIyArIGxpbXMoeD1jKDAsMSkseT1jKDAsMSkpIFxuXG5nZ3Bsb3QocC5tYXRjaGVzW3AubWF0Y2hlcyR0PT0wLF0sIGFlcyhwcm9wLnMsbS5kaXN0LCBjb2xvcj1wcm9wLnN0KSkgKyBcbiBnZW9tX3BvaW50KGFscGhhPTAuNykgKyB0aGVtZV9jbGFzc2ljKCkjICsgbGltcyh4PWMoMCwxKSx5PWMoMCwxKSkgXG5cbmBgYFxuYGBgIn0= -->

```r
```r
ggplot(p.matches, aes(x1,x2, color = as.factor(t))) + 
  annotate(\rect\, xmin=0, xmax=5, ymin=0, ymax=5, alpha=0.1, fill=\blue\) + 
  annotate(\rect\, xmin=1, xmax=6, ymin=1, ymax=6, alpha=0.1, fill=\red\) +
  scale_color_manual(values=c(\blue\, \red\), name=\Group\, labels = c(\Control\,\Treat\)) +
  geom_segment(data=p.matches[p.matches$t==0,],
               aes(x=x1,xend=x1.y,y=x2,yend=x2.y, 
                   alpha=cut(rank(p.dist),4,
                             labels=c(1,2,3,4))), 
               color= \black\, arrow = arrow(length = unit(0.2,\cm\))) +
    scale_alpha_discrete(name=\Cuts\, labels=c(\1st\, \2nd\, \3rd\, \4th\), range = c(1,0.1)) +
  geom_point() + theme_classic() 


ggplot(p.matches[p.matches$t==0,], aes(prop.s,prop.s.y, color=p.dist)) + 
  geom_abline(slope=1) + geom_point() + theme_classic() + lims(x=c(0,1),y=c(0,1)) 

ggplot(p.matches[p.matches$t==0,], aes(prop.s,prop.wt, color=prop.st)) + 
 geom_point(alpha=0.7) + theme_classic()# + lims(x=c(0,1),y=c(0,1)) 

ggplot(p.matches[p.matches$t==0,], aes(p.dist, m.dist, color=prop.st)) + 
 geom_point(alpha=0.7) + theme_classic()# + lims(x=c(0,1),y=c(0,1)) 

ggplot(p.matches[p.matches$t==0,], aes(prop.s,m.dist, color=prop.st)) + 
 geom_point(alpha=0.7) + theme_classic()# + lims(x=c(0,1),y=c(0,1)) 

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->






<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5nZ2FycmFuZ2UoXG5nZ3Bsb3QoZXN0cywgYWVzKG4sIHZhcmlhbmNlKSkgKyBnZW9tX2xpbmUoKSArIFxuICAgIGdlb21faGxpbmUoZGF0YSA9IG91dHB1dCwgYWVzKHlpbnRlcmNlcHQ9dmFycywgY29sb3I9bW9kZWwpKSArXG4gICAgbGFicyh4PVxcTnVtYmVyIG9mIHVuaXRzIHJlbW92ZWRcXCwgeT1cXEF2ZXJhZ2UgZXN0aW1hdGUgdmFyaWFuY2VcXCksXG5cbmdncGxvdChlc3RzLCBhZXMobiwgbWF4KSkgKyBnZW9tX2xpbmUoKSArIFxuICAgIGdlb21faGxpbmUoZGF0YSA9IG91dHB1dCwgYWVzKHlpbnRlcmNlcHQ9bWF4LnZhbCwgY29sb3I9bW9kZWwpKSArXG4gICAgbGFicyh4PVxcTnVtYmVyIG9mIHVuaXRzIHJlbW92ZWRcXCwgeT1cXE1heGltdW0gZXN0aW1hdGVcXCksXG5cbmdncGxvdChlc3RzLCBhZXMobiwgYXYpKSArIGdlb21fbGluZSgpICsgXG4gICAgZ2VvbV9obGluZShkYXRhID0gb3V0cHV0LCBhZXMoeWludGVyY2VwdD1hcy5udW1lcmljKGF2KSwgY29sb3I9bW9kZWwpKSArIFxuICAgIGxhYnMoeD1cXE51bWJlciBvZiB1bml0cyByZW1vdmVkXFwsIHk9XFxBdmVyYWdlIGVzdGltYXRlXFwpLFxuY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9IFxcYm90dG9tXFxcbikgJT4lIGFubm90YXRlX2ZpZ3VyZSh0b3AgPSBcXE91dHB1dCBmb3IgNTEyIG1vZGVscyBpbmNsdWRpbmcgc2Vjb25kIGFuZCB0aGlyZCBvcmRlciBpbnRlcmFjdGlvbnNcXClcblxuYGBgXG5gYGAifQ== -->

```r
```r

ggarrange(
ggplot(ests, aes(n, variance)) + geom_line() + 
    geom_hline(data = output, aes(yintercept=vars, color=model)) +
    labs(x=\Number of units removed\, y=\Average estimate variance\),

ggplot(ests, aes(n, max)) + geom_line() + 
    geom_hline(data = output, aes(yintercept=max.val, color=model)) +
    labs(x=\Number of units removed\, y=\Maximum estimate\),

ggplot(ests, aes(n, av)) + geom_line() + 
    geom_hline(data = output, aes(yintercept=as.numeric(av), color=model)) + 
    labs(x=\Number of units removed\, y=\Average estimate\),
common.legend = T, legend = \bottom\
) %>% annotate_figure(top = \Output for 512 models including second and third order interactions\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG4jIGNvdnMgPC0gc3Vic2V0KHAubWF0Y2hlcywgc2VsZWN0ID0gYyh4MSwgeDIsIHQpKVxuIyBcbiMgYmFsLnRhYihjb3ZzLCB0cmVhdCA9IHAubWF0Y2hlcyR0KVxuIyBiYWwudGFiKGNvdnMsIHRyZWF0ID0gcC5tYXRjaGVzJHQsIHdlaWdodHMgPSBwLm1hdGNoZXMkcHJvcC53dClcblxuIyBiYWxzIDwtIGJhbC50YWIodCB+IHgxICsgeDIsIGRhdGEgPSBwLm1hdGNoZXMsIGRpc3RhbmNlID0gXFxwcm9wLnNcXCwgcy5kLmRlbm9tID0gXFx0cmVhdGVkXFwpXG5cbiMgYmFscyRCYWxhbmNlW2MoMjpucm93KGJhbHMkQmFsYW5jZSkpLDJdXG5cbmJhbC53dCA8LSBiYWwudGFiKHQgfiB4MSArIHgyLCBkYXRhID0gcC5tYXRjaGVzLCB3ZWlnaHRzID0gXFxwcm9wLnd0XFwsXG4gICAgICAgIGRpc3RhbmNlID0gXFxwcm9wLnNcXCwgcy5kLmRlbm9tID0gXFx0cmVhdGVkXFwsIHVuYmFsPVQpJEJhbGFuY2VcblxuIyAgICAgICAgICAgIFR5cGUgRGlmZi5BZGpcbiMgcHJvcC5zIERpc3RhbmNlICAgMC4wNjkxXG4jIHgxICAgICAgQ29udGluLiAgIDAuMDUyOVxuIyB4MiAgICAgIENvbnRpbi4gICAwLjA5MzJcblxuXG5iYWwuc3RyYXQgPC0gYmFsLnRhYih0IH4geDEgKyB4MiwgZGF0YSA9IHAubWF0Y2hlcywgc3ViY2xhc3MgPSBcXHByb3Auc3RcXCxcbiAgICAgICAgZGlzdGFuY2UgPSBcXHByb3Auc1xcLCBzLmQuZGVub20gPSBcXHRyZWF0ZWRcXCwgXG4gICAgICAgIHdoaWNoLnN1YmNsYXNzID0gLmFsbCwgc3ViY2xhc3Muc3VtbWFyeSA9IFRSVUUpJEJhbGFuY2VcblxuYGBgXG5gYGAifQ== -->

```r
```r

# covs <- subset(p.matches, select = c(x1, x2, t))
# 
# bal.tab(covs, treat = p.matches$t)
# bal.tab(covs, treat = p.matches$t, weights = p.matches$prop.wt)

# bals <- bal.tab(t ~ x1 + x2, data = p.matches, distance = \prop.s\, s.d.denom = \treated\)

# bals$Balance[c(2:nrow(bals$Balance)),2]

bal.wt <- bal.tab(t ~ x1 + x2, data = p.matches, weights = \prop.wt\,
        distance = \prop.s\, s.d.denom = \treated\, unbal=T)$Balance

#            Type Diff.Adj
# prop.s Distance   0.0691
# x1      Contin.   0.0529
# x2      Contin.   0.0932


bal.strat <- bal.tab(t ~ x1 + x2, data = p.matches, subclass = \prop.st\,
        distance = \prop.s\, s.d.denom = \treated\, 
        which.subclass = .all, subclass.summary = TRUE)$Balance

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->







<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5nZ2FycmFuZ2UoXG5nZ3Bsb3QoYiwgYWVzKHg9cm93KGIpWywxXSkpICsgZ2VvbV9saW5lKGFlcyh5PXgxLmJhbCwgY29sb3I9XFxNYXRjaGVkXFwpKSArXG4gICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1iYWwud3RbMiwzXSwgY29sb3I9XFxXZWlnaHRlZFxcKSwgKSArXG4gICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1iYWwuc3RyYXRbMiwzXSwgY29sb3I9XFxTdHJhdGlmaWVkXFwpKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxyaWdodFxcKSArXG4gICAgZ2VvbV9yaWJib24oYWVzKHltaW49LTAuMSx5bWF4PTAuMSksIGFscGhhPTAuMikgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcYmxhY2tcXCwgXFxkYXJrYmx1ZVxcLCBcXGJsdWVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXFxNZXRob2RcXCkgKyBsYWJzKHRpdGxlPVxceDFcXCx4PVxcXFwseT1cXFxcKSxcbmdncGxvdChiLCBhZXMoeD1yb3coYilbLDFdKSkgKyBnZW9tX2xpbmUoYWVzKHk9eDIuYmFsLCBjb2xvcj1cXHgyIE1hdGNoXFwpKSArIFxuICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9YmFsLnd0WzMsM10sIGNvbG9yPVxceDIgV3RcXCkpICtcbiAgICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PWJhbC5zdHJhdFszLDNdLCBjb2xvcj1cXHgyIFN0cmF0XFwpKSArXG4gICAgZ2VvbV9yaWJib24oYWVzKHltaW49LTAuMSx5bWF4PTAuMSksIGFscGhhPTAuMikgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxccmlnaHRcXCkgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcYmxhY2tcXCwgXFxibHVlXFwsIFxcZGFya3JlZFxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBcXENvdmFyaWF0ZVxcKSArIGxhYnModGl0bGU9XFx4MlxcLHg9XFxcXCx5PVxcXFwpLFxuY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9IFxcdG9wXFxcblxuKSAlPiUgYW5ub3RhdGVfZmlndXJlKHRvcCA9IFxcQ292YXJpYXRlIGJhbGFuY2UgYnkgZGlmZmVyZW5jZSBpbiBzdGFuZGFyaXNlZCBtZWFuc1xcLCBcbiAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gXFxTdGFuZGFyZGlzZWQgbWVhbiBkaWZmZXJlbmNlXFwsXG4gICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gXFxOdW1iZXIgb2YgcGFpcnMgcmVtb3ZlZFxcKVxuYGBgXG5gYGAifQ== -->

```r
```r

ggarrange(
ggplot(b, aes(x=row(b)[,1])) + geom_line(aes(y=x1.bal, color=\Matched\)) +
    geom_hline(aes(yintercept=bal.wt[2,3], color=\Weighted\), ) +
    geom_hline(aes(yintercept=bal.strat[2,3], color=\Stratified\)) +
    theme_classic() + theme(legend.position = \right\) +
    geom_ribbon(aes(ymin=-0.1,ymax=0.1), alpha=0.2) +
    scale_color_manual(values = c(\black\, \darkblue\, \blue\), 
                       name = \Method\) + labs(title=\x1\,x=\\,y=\\),
ggplot(b, aes(x=row(b)[,1])) + geom_line(aes(y=x2.bal, color=\x2 Match\)) + 
    geom_hline(aes(yintercept=bal.wt[3,3], color=\x2 Wt\)) +
    geom_hline(aes(yintercept=bal.strat[3,3], color=\x2 Strat\)) +
    geom_ribbon(aes(ymin=-0.1,ymax=0.1), alpha=0.2) +
    theme_classic() + theme(legend.position = \right\) +
    scale_color_manual(values = c(\black\, \blue\, \darkred\), 
                       name = \Covariate\) + labs(title=\x2\,x=\\,y=\\),
common.legend = T, legend = \top\

) %>% annotate_figure(top = \Covariate balance by difference in standarised means\, 
                      left = \Standardised mean difference\,
                      bottom = \Number of pairs removed\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBmb3IgKGkgaW4gMToyMDApIHtcbiMgc2FwcGx5KDIwMCwgZnVuY3Rpb24oeCkgZm9yKGkgaW4gMTp4KSB7bWVhbihybm9ybSgyMDApKX0pXG4jIH1cbmBgYFxuYGBgIn0= -->

```r
```r
# for (i in 1:200) {
# sapply(200, function(x) for(i in 1:x) {mean(rnorm(200))})
# }

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->





<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGlzdGFuY2UgPC0gZml0dGVkKGdsbSh0cmVhdH5hZ2UrZWR1YyxsYWxvbmRlLCBmYW1pbHk9XFxiaW5vbWlhbFxcKSlcblxuc3Byb2JzIDwtIHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gcm91bmQoNikgKyAxKVxuXG5xdWFudGlsZShkaXN0YW5jZVtsYWxvbmRlJHRyZWF0PT0xXSwgcHJvYnMgPSBzcHJvYnMsIG5hLnJtID0gVFJVRSlcblxuYGBgXG5gYGAifQ== -->

```r
```r
distance <- fitted(glm(treat~age+educ,lalonde, family=\binomial\))

sprobs <- seq(0, 1, length.out = round(6) + 1)

quantile(distance[lalonde$treat==1], probs = sprobs, na.rm = TRUE)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxub3B0bWF0Y2g6Om1hdGNoX29uKGRpc3RhbmNlLCB6PWxhbG9uZGUkdHJlYXQpXG5cbmBgYCJ9 -->

```r
optmatch::match_on(distance, z=lalonde$treat)
An object of class "DenseMatrix"
         control
treatment          186          187          188         189          190          191          192          193         194         195          196         197         198          199         200
      1   0.0344197445 0.0544716613 0.0653984572 0.022009534 0.0552959617 0.0025286797 0.0246904028 0.0859393864 0.007008826 0.010202874 0.0248871414 0.032257993 0.009930094 0.0393595932 0.078239007
      2   0.0364328109 0.0163808942 0.0054540982 0.092862089 0.0155565937 0.0733812351 0.0461621526 0.0150868309 0.077861382 0.081055430 0.0957396968 0.038594563 0.060922461 0.0314929622 0.007386452
         control
treatment         201          202          203         204         205         206          207          208         209          210          211         212         213         214          215
      1   0.034868512 0.0552959617 0.0401606405 0.010913833 0.006592504 0.046563399 0.0409629647 0.0058493302 0.045976877 0.0133687600 0.0423573652 0.002005214 0.015105517 0.076127653 0.0393595932
      2   0.105721067 0.0155565937 0.0306919150 0.081766388 0.064260051 0.024289157 0.0298895907 0.0650032252 0.116829432 0.0842213155 0.0284951903 0.068847341 0.085958073 0.005275098 0.0314929622
         control
treatment          216         217          218         219          220          221         222          223         224         225          226          227          228          229         230
      1   0.0767549377 0.056728339 0.0493862865 0.037979008 0.0544716613 0.0493862865 0.014608307 0.0596040046 0.053753811 0.023017835 0.0752742364 0.0496032463 0.0596040046 0.0805856355 0.015925664
      2   0.0059023823 0.014124217 0.0214662689 0.108831563 0.0163808942 0.0214662689 0.056244248 0.0112485508 0.124606367 0.093870391 0.0044216810 0.0212493091 0.0112485508 0.0097330801 0.054926892
         control
treatment          231         232          233          234          235         236          237          238         239         240          241         242         243          244          245
      1   0.0859393864 0.089821929 0.0596040046 0.0393595932 0.0859393864 0.031101061 0.0610472562 0.0128505183 0.010202874 0.019902128 0.0338383126 0.079096301 0.029529804 0.0058493302 0.0524422100
      2   0.0150868309 0.018969374 0.0112485508 0.0314929622 0.0150868309 0.039751495 0.0098052992 0.0837030737 0.081055430 0.050950427 0.0370142428 0.008243745 0.041322751 0.0650032252 0.0184103455
         control
treatment         246          247         248         249         250          251          252        253          254          255         256          257          258         259         260
      1   0.004020805 0.0708525554 0.016127944 0.008441925 0.051436026 0.0487874847 0.0267457681 0.06457150 0.0413391937 0.0415528334 0.038631920 0.0443486785 0.0493862865 0.056728339 0.008251782
      2   0.066831750 0.0000000000 0.054724611 0.079294480 0.122288581 0.0220650708 0.0975983235 0.13542406 0.0295133617 0.0292997220 0.109484476 0.0265038769 0.0214662689 0.014124217 0.079104338
         control
treatment          261        262         263         264          265          266          267          268         269         270          271         272         273         274         275
      1   0.0544716613 0.06821907 0.008251782 0.077382826 0.0641671299 0.0700061951 0.0596040046 0.0639445018 0.000000000 0.012143422 0.0883125844 0.050977968 0.091334442 0.103130260 0.036591195
      2   0.0163808942 0.13907163 0.079104338 0.006530270 0.0066854255 0.0008463604 0.0112485508 0.0069080536 0.070852555 0.082995977 0.0174600290 0.121830523 0.020481887 0.032277704 0.034261360
         control
treatment          276          277         278         279          280         281          282          283          284          285        286          287          288          289          290
      1   0.0399475884 0.0737969247 0.072323024 0.043762994 0.0596040046 0.043762994 0.0647824766 0.0859393864 0.0443486785 0.0426495738 0.06587304 0.0967697159 0.0805856355 0.0426495738 0.0805856355
      2   0.0309049670 0.0029443692 0.001470469 0.114615549 0.0112485508 0.114615549 0.0060700789 0.0150868309 0.0265038769 0.1135021292 0.13672559 0.0259171605 0.0097330801 0.1135021292 0.0097330801
         control
treatment          291         292          293          294          295         296          297          298          299          300          301          302          303          304
      1   0.0138505243 0.091334442 0.0280985437 0.0850734147 0.0859393864 0.058167978 0.0457522991 0.0691609868 0.0387722879 0.0844383142 0.0393595932 0.0700061951 0.0844383142 0.0267457681
      2   0.0570020311 0.020481887 0.0989510991 0.0142208593 0.0150868309 0.129020534 0.0251002564 0.0016915686 0.0320802675 0.0135857588 0.0314929622 0.0008463604 0.0135857588 0.0975983235
         control
treatment          305          306          307          308          309          310          311          312          313          314          315         316         317         318         319
      1   0.0250683014 0.0508033402 0.0381856737 0.0596040046 0.0967697159 0.0350018758 0.0493862865 0.0952460701 0.0575559600 0.0700061951 0.0532996840 0.091334442 0.067079651 0.057111949 0.089821929
      2   0.0959208569 0.0200492152 0.0326668817 0.0112485508 0.0259171605 0.0358506796 0.0214662689 0.0243935146 0.0132965955 0.0008463604 0.1241522394 0.020481887 0.003772904 0.127964504 0.018969374
         control
treatment          320          321          322         323          324          325          326         327          328         329          330          331         332          333         334
      1   0.0829404943 0.0844383142 0.0805856355 0.010202874 0.0030617991 0.0868064317 0.0279190820 0.078466777 0.0700061951 0.010481106 0.0967697159 0.0297602314 0.003824400 0.0618811225 0.057111949
      2   0.0120879389 0.0135857588 0.0097330801 0.081055430 0.0739143545 0.0159538763 0.0987716374 0.007614222 0.0008463604 0.060371449 0.0259171605 0.1006127868 0.067028155 0.0089714330 0.127964504
         control
treatment          335         336        337          338          339         340          341          342          343          344          345         346         347         348          349
      1   0.0737969247 0.091334442 0.07307488 0.0805856355 0.0647824766 0.005304578 0.0874436877 0.0946019439 0.0937255052 0.0443486785 0.0624940950 0.012143422 0.062787644 0.049892943 0.0946019439
      2   0.0029443692 0.020481887 0.14392743 0.0097330801 0.0060700789 0.065547977 0.0165911322 0.0237493885 0.0228729498 0.0265038769 0.0083584605 0.082995977 0.133640199 0.120745498 0.0237493885
         control
treatment          350          351          352          353          354          355         356          357         358          359          360          361         362          363
      1   0.0344197445 0.0275978248 0.0737969247 0.0493862865 0.0552959617 0.0835742152 0.099178152 0.0138862389 0.092208046 0.0596040046 0.0799547031 0.0928500992 0.089821929 0.0752742364
      2   0.0364328109 0.0432547306 0.0029443692 0.0214662689 0.0155565937 0.0127216597 0.028325597 0.0847387943 0.021355491 0.0112485508 0.0091021477 0.0219975438 0.018969374 0.0044216810
         control
treatment          364         365          366          367         368         369          370        371          372         373          374         375          376          377         378
      1   0.0952460701 0.077610299 0.0647824766 0.0952460701 0.099178152 0.099178152 0.0937255052 0.06661790 0.0952460701 0.099178152 0.0544716613 0.016320532 0.0967697159 0.0714746749 0.090693717
      2   0.0243935146 0.006757744 0.0060700789 0.0243935146 0.028325597 0.028325597 0.0228729498 0.13747046 0.0243935146 0.028325597 0.0163808942 0.087173087 0.0259171605 0.0006221195 0.019841162
         control
treatment          379          380          381          382          383         384         385         386          387          388         389         390          391         392         393
      1   0.0415528334 0.0140518189 0.0952460701 0.0145898418 0.0835742152 0.036591195 0.021440475 0.043121480 0.0814459497 0.0136493259 0.033410401 0.104669382 0.0967697159 0.012143422 0.103130260
      2   0.0292997220 0.0568007365 0.0243935146 0.0854423972 0.0127216597 0.034261360 0.049412081 0.113974036 0.0105933943 0.0572032296 0.104262956 0.033816827 0.0259171605 0.082995977 0.032277704
         control
treatment         394          395          396          397         398          399         400         401         402          403          404          405         406         407         408
      1   0.104669382 0.0346304230 0.0859393864 0.0853034947 0.101594087 0.0844383142 0.007884573 0.016687154 0.030105994 0.0976496996 0.1000608899 0.0287461457 0.091334442 0.012143422 0.058613765
      2   0.033816827 0.0362221324 0.0150868309 0.0144509392 0.030741531 0.0135857588 0.062967982 0.054165401 0.040746561 0.0267971442 0.0292083345 0.0421064098 0.020481887 0.082995977 0.129466321
         control
treatment         409         410         411         412          413         414          415          416          417          418          419          420          421          422        423
      1   0.008966595 0.090693717 0.010202874 0.100709622 0.0915665540 0.091334442 0.0536485817 0.0952460701 0.0889511946 0.0859393864 0.0928500992 0.0589940729 0.0493862865 0.0868064317 0.06500611
      2   0.079819150 0.019841162 0.081055430 0.029857066 0.0207139986 0.020481887 0.0172039737 0.0243935146 0.0180986392 0.0150868309 0.0219975438 0.0118584825 0.0214662689 0.0159538763 0.13585867
         control
treatment          424         425          426         427          428         429          430         431          432          433         434          435         436          437         438
      1   0.0952460701 0.104669382 0.0967697159 0.033410401 0.0835742152 0.000732180 0.0820782812 0.022514069 0.0891825426 0.0114349122 0.077837852 0.0260383370 0.103130260 0.1000608899 0.076127653
      2   0.0243935146 0.033816827 0.0259171605 0.104262956 0.0127216597 0.070120375 0.0112257257 0.093366624 0.0183299871 0.0822874676 0.006985297 0.0448142185 0.032277704 0.0292083345 0.005275098
         control
treatment          439         440          441          442          443          444          445         446          447          448          449          450          451          452
      1   0.0752742364 0.068541180 0.0961242884 0.0746483845 0.0937255052 0.0647824766 0.0647824766 0.103130260 0.0799547031 0.0255681533 0.0961242884 0.0853034947 0.0976496996 0.0835742152
      2   0.0044216810 0.002311375 0.0252717330 0.0037958290 0.0228729498 0.0060700789 0.0060700789 0.032277704 0.0091021477 0.0964207088 0.0252717330 0.0144509392 0.0267971442 0.0127216597
         control
treatment         453          454         455         456         457         458          459          460          461          462          463          464         465         466         467
      1   0.103130260 0.0714746749 0.103130260 0.100709622 0.043121480 0.022006538 0.0952460701 0.0700061951 0.0937255052 0.0883125844 0.1000608899 0.0473757512 0.104669382 0.099178152 0.099178152
      2   0.032277704 0.0006221195 0.032277704 0.029857066 0.113974036 0.048846018 0.0243935146 0.0008463604 0.0228729498 0.0174600290 0.0292083345 0.0234768042 0.033816827 0.028325597 0.028325597
         control
treatment          468          469         470         471          472          473          474          475          476          477         478          479         480          481         482
      1   0.0641671299 0.0393595932 0.099178152 0.053753811 0.0829404943 0.0071996172 0.0883125844 0.0952460701 0.0985306947 0.0693855400 0.029529804 0.0844383142 0.100709622 0.0532996840 0.047245634
      2   0.0066854255 0.0314929622 0.028325597 0.124606367 0.0120879389 0.0780521727 0.0174600290 0.0243935146 0.0276781393 0.0014670154 0.041322751 0.0135857588 0.029857066 0.1241522394 0.118098190
         control
treatment         483          484          485          486         487         488          489         490         491         492          493          494         495        496          497
      1   0.044872095 0.0138505243 0.0693855400 0.0493862865 0.031679174 0.060869179 0.0250683014 0.045157598 0.011785551 0.033410401 0.0737969247 0.0752742364 0.068541180 0.07674388 0.0573358510
      2   0.115724650 0.0570020311 0.0014670154 0.0214662689 0.039173381 0.131721734 0.0959208569 0.025694957 0.059067004 0.104262956 0.0029443692 0.0044216810 0.002311375 0.14759644 0.0135167044
         control
treatment          498          499         500         501          502          503          504          505         506          507         508          509          510         511          512
      1   0.0151655274 0.0737969247 0.029529804 0.091334442 0.0618811225 0.0058493302 0.0814459497 0.0641671299 0.009180777 0.0700061951 0.036591195 0.0604358000 0.0937255052 0.037979008 0.0820782812
      2   0.0556870280 0.0029443692 0.041322751 0.020481887 0.0089714330 0.0650032252 0.0105933943 0.0066854255 0.061671778 0.0008463604 0.034261360 0.0104167554 0.0228729498 0.108831563 0.0112257257
         control
treatment          513          514          515          516          517          518          519         520          521         522          523          524          525          526
      1   0.0407495735 0.0850734147 0.0812171614 0.0647824766 0.0889511946 0.0823073606 0.0868064317 0.091334442 0.0874436877 0.091334442 0.0445635754 0.0502029595 0.0700061951 0.0814459497
      2   0.0301029819 0.0142208593 0.0103646060 0.0060700789 0.0180986392 0.0114548051 0.0159538763 0.020481887 0.0165911322 0.020481887 0.0262889800 0.0206495959 0.0008463604 0.0105933943
         control
treatment          527          528          529          530        531          532         533         534         535         536          537         538         539          540         541
      1   0.0829404943 0.0045637979 0.0077260788 0.0976496996 0.08061326 0.0387722879 0.091334442 0.005040552 0.103130260 0.099178152 0.0647824766 0.089821929 0.060709290 0.0868064317 0.008061540
      2   0.0120879389 0.0662887575 0.0785786342 0.0267971442 0.15146582 0.0320802675 0.020481887 0.075893108 0.032277704 0.028325597 0.0060700789 0.018969374 0.131561845 0.0159538763 0.078914096
         control
treatment          542          543         544        545         546          547        548          549         550         551          552          553         554         555          556
      1   0.0952460701 0.1000608899 0.079096301 0.07771755 0.001270624 0.0544716613 0.06821907 0.0532996840 0.101594087 0.103130260 0.0937255052 0.0133687600 0.101594087 0.103130260 0.0573358510
      2   0.0243935146 0.0292083345 0.008243745 0.14857010 0.069581932 0.0163808942 0.13907163 0.1241522394 0.030741531 0.032277704 0.0228729498 0.0842213155 0.030741531 0.032277704 0.0135167044
         control
treatment          557          558          559         560          561         562         563         564          565          566          567         568          569         570          571
      1   0.0814459497 0.0859393864 0.0952460701 0.038631920 0.0961242884 0.103130260 0.031679174 0.019902128 0.0151655274 0.0820782812 0.0379734621 0.091334442 0.0187761110 0.091334442 0.0859393864
      2   0.0105933943 0.0150868309 0.0243935146 0.109484476 0.0252717330 0.032277704 0.039173381 0.050950427 0.0556870280 0.0112257257 0.0328790933 0.020481887 0.0520764445 0.020481887 0.0150868309
         control
treatment        572         573          574         575         576         577          578         579        580         581         582          583          584          585         586
      1   0.07965223 0.089821929 0.0952460701 0.044403071 0.103130260 0.099178152 0.0032546278 0.009930094 0.06457150 0.043292142 0.103130260 0.0961242884 0.0522241111 0.0037867205 0.099178152
      2   0.15050479 0.018969374 0.0243935146 0.115255627 0.032277704 0.028325597 0.0741071832 0.060922461 0.13542406 0.114144697 0.032277704 0.0252717330 0.0186284444 0.0746392760 0.028325597
         control
treatment         587         588        589          590         591          592         593         594         595          596        597         598          599         600          601
      1   0.101594087 0.045509682 0.07674388 0.0850734147 0.104669382 0.0700061951 0.038631920 0.099178152 0.015992796 0.0937255052 0.06457150 0.099178152 0.0930826909 0.032080363 0.0151655274
      2   0.030741531 0.116362237 0.14759644 0.0142208593 0.033816827 0.0008463604 0.109484476 0.028325597 0.086845351 0.0228729498 0.13542406 0.028325597 0.0222301355 0.102932918 0.0556870280
         control
treatment         602          603        604          605        606         607         608          609          610          611         612          613         614
      1   0.101594087 0.0493862865 0.06543996 0.0199399478 0.07576599 0.103130260 0.046563399 0.0624940950 0.0952460701 0.0490042020 0.089590375 0.0153674479 0.103130260
      2   0.030741531 0.0214662689 0.13629251 0.0907925033 0.14661854 0.032277704 0.024289157 0.0083584605 0.0243935146 0.0218483535 0.018737820 0.0554851075 0.032277704
 [ reached getOption("max.print") -- omitted 183 rows ]
Slot "call":
optmatch::match_on(x = distance, z = lalonde$treat)

dist()
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KE1hdGNoSXQpCmxpYnJhcnkoY2VtKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShjb2JhbHQpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdhcG1pbmRlcikKCmBgYAoKCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyNmdW5jdGlvbiB0byBjcmVhdGUgZGF0YSBzZXQgMgpjZDEgPC0gZnVuY3Rpb24oKSB7CiAgICAKICAgIHQgPC0gYyhyZXAoMCwxMDApLCByZXAoMSwxMDApKQogICAgeDEgPC0gcnVuaWYoMjAwLCAwLDUpICsgdAogICAgeDIgPC0gcnVuaWYoMjAwLCAwLDUpICsgdAogICAgeDMgPC0gcmVwKGMocmVwKCJBIiwyNSksIHJlcCgiQiIsMjUpLHJlcCgiQyIsMjUpLCByZXAoIkQiLDI1KSksMikKICAgICMgdCA8LSBjKHJlcCgiQyIsMTAwKSxyZXAoIlQiLDEwMCkpCiAgICB5IDwtIDIqdCArIHgxICsgeDIgIysgcm5vcm0oMjAwKQoKICAgIGQgPC0gbGlzdCh4MT14MSx4Mj14Mix4Mz14Myx0PXQseT15KSAlPiUgYXMuZGF0YS5mcmFtZSgpCgogICAgcmV0dXJuKGQpCn0KCgpkaXN0cyA8LSBmdW5jdGlvbihkYXRhLCBmb3JtLnQ9TlVMTCwgbW9kZWwudD1OVUxMLCBmb3JtLnk9TlVMTCwgbW9kZWwueT1OVUxMKSB7CiAgICAKICAgICNnZXQgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGZyb20gdGhlIGZvcm11bGEKICAgIHQgPSBhbGwudmFycyhmb3JtLnQpWzFdCiAgICAKICAgICNjaGVjayB0aGUgcmVzcG9uc2UgaXMgYmluYXJ5IGZvciBsb2dpc3RpYyByZWdyZXNzaW9uCiAgICBpZihhbGwoYXMubnVtZXJpYyhkYXRhW3RdID09IGRhdGFbMSx0XSkgJWluJSBjKDAsMSkpKSB7CiAgICAgICAgZGF0YVt0XSA8LSBhcy5udW1lcmljKGRhdGFbdF0gIT0gZGF0YVsxLHRdKQogICAgfQogICAgCiAgICAjY2FsY3VsYXRlIHRoZSBwcm9wZW5zaXR5IHNjb3JlIHVzaW5nIGxvZ2lzdGljIHJlZ3Jlc3Npb24KICAgIGlmIChpcy5udWxsKG1vZGVsLnQpKXsKICAgICAgICBwcm9wLnMgPC0gZ2xtKGZvcm0udCwgZGF0YT1kYXRhLCBmYW1pbHkgPSAiYmlub21pYWwiKSAlPiUgZml0dGVkKCkKICAgIH0KICAgIAogICAgCiAgICAKICAgIGR0IDwtIGNiaW5kKGlkeD0gc3RyX3BhZChyb3cubmFtZXMoZGF0YSksIG5jaGFyKG5yb3coZGF0YSkpLCBwYWQgPSAiMCIpLCBkYXRhLCBwcm9wLnMpCiAgICAKICAgIGR0IDwtIGR0ICU+JSBtdXRhdGUocHJvcC53dD1pZmVsc2UodD09MSwgMS9wcm9wLnMsMS8oMS1wcm9wLnMpKSkKICAgIAogICAgUSA8LSBxdWFudGlsZShkdCRwcm9wLnMsIHByb2I9c2VxKGZyb209MCx0bz0xLGJ5PTAuMiksbmEucm09VFJVRSkKICAgIGR0JHByb3Auc3QgPC0gY3V0KGR0JHByb3AucywgYnJlYWtzID0gUSwgbGFiZWxzID0gMTo1LCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUpCiAgICAKICAgIHJldHVybihkdCkKfQoKZDEgPC0gZGlzdHMoZm9ybS50PXQgfiB4MSArIHgyLCBkYXRhPWNkMSgpKQoKCiMgYSA8LSBnbG0odCB+IHgxICsgeDIsIGRhdGE9ZDEsIGZhbWlseSA9ICJiaW5vbWlhbCIpIAojIG0xIDwtIGdsbShpZmVsc2UodD09IkMiLDAsMSl+eDEreDMsIGRhdGE9ZDEpCiMgYSRtb2RlbAojIAojIGFsbC52YXJzKGEkdGVybXMpCiMgCiMgbG0oeX50LCBkYXRhID0gZDEpCiMgbG0oeX50LCB3ZWlnaHRzID0gZDEkcHJvcC53LCBkYXRhID0gZDEpCiMgCiMgCiMgc3VtbWFyeShkMSRwcm9wLnMpCiMgCiMgdHlwZW9mKGEpCgojIGEgJT4lIHByZWRpY3QobmV3ZGF0YT1kMSwgdHlwZSA9ICJyZXNwb25zZSIpID09IGEkZml0dGVkLnZhbHVlcwoKZGF0YSA8LSBjZDEoKQoKZ2dwbG90KGRhdGEsIGFlcyh4MSwgeDIsIGNvbG9yPXQpKSArIGdlb21fcG9pbnQoKSAKCgoKCmBgYAoKYGBge3J9CmYgPC0gdCB+IHgxICsgeDIKbWRhdGEgPC0gZGlzdHMoZGF0YSwgZm9ybS50ID0gZikKbWF0Y2hlcyA8LSBkaXN0Lm1hdGNoZXMoZj1mLCBkYXRhPW1kYXRhKQpgYGAKCgoKYGBge3J9CgpMaW5lIDwtICBndmlzU2NhdHRlckNoYXJ0KGRhdGFbYygieDEiLCJ4MiIsICJ0IildLAogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9bGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZD0icmlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9IkhlbGxvIFdvcmxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlVGV4dFN0eWxlPSJ7Y29sb3I6J3JlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250TmFtZTonQ291cmllcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZToxNn0iLAogICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yPSIjRDNEM0QzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHZBeGlzPSJ7Z3JpZGxpbmVzOntjb2xvcjoncmVkJywgY291bnQ6M319IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGhBeGlzPSJ7dGl0bGU6J1gxJywgdGl0bGVUZXh0U3R5bGU6e2NvbG9yOidibHVlJ319IiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllcz0iW3tjb2xvcjonZ3JlZW4nLCB0YXJnZXRBeGlzSW5kZXg6IDB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjb2xvcjogJ29yYW5nZScsdGFyZ2V0QXhpc0luZGV4OjF9XSIsCiAgICAgICAgICAgICAgICAgICAgICAgICB2QXhlcz0iW3t0aXRsZTondmFsMSd9LCB7dGl0bGU6J3ZhbDInfV0iLAogICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kPSJib3R0b20iLAogICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVUeXBlPSJmdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD01MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9NTAwCiAgICAgICAgICAgICAgICAgICAgICAgKSwgY2hhcnRpZCA9IDU1NTU1KQpwbG90KExpbmUpCgpgYGAKCgpgYGB7cn0KCmRmIDwtIGdhcG1pbmRlciAKCmZpZyA8LSBtZGF0YSAlPiUKCiAgcGxvdF9seSgKCiAgICB4ID0gfngxLCAKCiAgICB5ID0gfngyLCAKCiAgICAjIHNpemUgPSB+cG9wLCAKCiAgICBjb2xvciA9IH5jKCJObyIsIlllcyIpW2ZhY3Rvcih0KV0sIAogICAgCiAgICAjIHRleHQgPSB+Y29sb3IsCgogICAgZnJhbWUgPSB+cHJvcC5zdCwKCiAgICAjIHRleHQgPSBwYXN0ZTAocm91bmQofngxLDIpLCAiLCAiLHJvdW5kKH54MiwyKSksCiAgICAKICAgIGhvdmVydGVtcGxhdGUgPSAnJXtjb2xvcn06ICV7eDouMmZ9LCAle3k6LjJmfTxleHRyYT48L2V4dHJhPicsCgogICAgIyBob3ZlcmluZm8gPSAidGV4dCIsCgogICAgdHlwZSA9ICdzY2F0dGVyJywKCiAgICBtb2RlID0gJ21hcmtlcnMnCgogICkKCiMgZmlnIDwtIGZpZyAlPiUgbGF5b3V0KAojIAojICAgICB4YXhpcyA9IGxpc3QoCiMgCiMgICAgICAgdHlwZSA9ICJsb2ciCiMgCiMgICAgICkKIyAKIyAgICkKCgpwcmludChmaWcpCgpgYGAKCgoKYGBge3J9CmYxIDwtIHkgfiB4MiAqIHgxICogSSh4MSp4MikgKiBJKHgxXjIpICogSSh4Ml4yKSAqIEkoeDFeMip4MikgKiBJKHgxKngyXjIpICogSSh4MV4zKSAqIEkoeDJeMykKCm91dHB1dCA8LSBOVUxMCgoKZjEudCA8LSBwYXN0ZShmMVtbMl1dLGYxW1sxXV0sInQiLGMoIiIscGFzdGUoIisiLGxhYmVscyh0ZXJtcyhmMSkpKSkpCgojIGYxLnQgPC0gInkgfiB0ICsgeDEgKyB4MiIKCiMgZjEudCA8LSBzdHJfcmVwbGFjZV9hbGwoZjEudCwgIjoiLCAiKyIpCgoKZjEubCA8LSBsYXBwbHkoZjEudCxmdW5jdGlvbih4KSBsbSh4LCBkYXRhPWQxKSkKCiMgZjEucyA8LSBzYXBwbHkoZjEudCxmdW5jdGlvbih4KSBsbSh4LCBkYXRhPWQxLCB3ZWlnaHRzPSBkMSRwcm9wLnd0KSkKCmYxLmVzdCA8LSBzYXBwbHkoMTpsZW5ndGgoZjEubCksIGZ1bmN0aW9uKHgpIGYxLmxbW2MoeCwxLDIpXV0pCgpvdXRwdXQgPC0gcmJpbmQob3V0cHV0LCBjYmluZChtb2Q9IlZhbmlsbGEiLHZhcj12YXIoZjEuZXN0KSxtYXg9bWF4KGYxLmVzdCksIGF2PW1lYW4oZjEuZXN0KSkpCgpwbG90KGYxLmVzdCwgdHlwZSA9ICJsIikKCiMgWzFdIDAuMDM5OTEwNDkKIyBbMV0gNC4yMDA5MjQKCmYxLmwgPC0gbGFwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kMSwgd2VpZ2h0cz0gZDEkcHJvcC53dCkpCgojIGYxLnMgPC0gc2FwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kMSwgd2VpZ2h0cz0gZDEkcHJvcC53dCkpCgpmMS5lc3QgPC0gc2FwcGx5KDE6bGVuZ3RoKGYxLmwpLCBmdW5jdGlvbih4KSBmMS5sW1tjKHgsMSwyKV1dKQoKCgojIHZhcihmMS5lc3QpICAjW1sxXV1bMl0KIyBtYXgoZjEuZXN0KSAgI1tbMV1dWzJdCgpvdXRwdXQgPC0gcmJpbmQob3V0cHV0LCBjYmluZCgiV2VpZ2h0ZWQiLHZhcihmMS5lc3QpLCBtYXgoZjEuZXN0KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2PW1lYW4oZjEuZXN0KSkpCnBsb3QoZjEuZXN0LCB0eXBlID0gImwiKQojIFsxXSAwLjAwNTY4MzgyNQojIFsxXSAyLjUyNTYzNQoKdiA8LSBOVUxMCgpmb3IgKGkgaW4gMTo1KXsKICAgIAoKCmYxLmwgPC0gbGFwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kMVtkMSRwcm9wLnN0PT1pLF0gKSkKCiMgZjEucyA8LSBzYXBwbHkoZjEudCxmdW5jdGlvbih4KSBsbSh4LCBkYXRhPWQxLCB3ZWlnaHRzPSBkMSRwcm9wLnd0KSkKCiMgZjEubFtbOThdXQoKZjEuZXN0IDwtIHNhcHBseSgxOmxlbmd0aChmMS5sKSwgZnVuY3Rpb24oeCkgZjEubFtbYyh4LDEsMildXSkKCnYgPC0gcmJpbmQodixjYmluZCh2YXJpYW5jZT12YXIoZjEuZXN0KSwgbWF4PW1heChmMS5lc3QpLCBhdj1tZWFuKGYxLmVzdCkpKQoKfQoKb3V0cHV0IDwtIHJiaW5kKG91dHB1dCwgY2JpbmQoIlN0cmF0aWZpZWQiLGFwcGx5KHYsIDIsIG1lYW4pJT4ldCgpKSkgJT4lCiAgICBhcy5kYXRhLmZyYW1lKCkKIyBkMSAlPiUgc2VsZWN0KHByb3Auc3QsIHQpICU+JSBncm91cF9ieV9hbGwoKSAlPiUgbXV0YXRlKG49bigpKSAlPiUgdW5pcXVlKCkKcGxvdChmMS5lc3QsIHR5cGUgPSAibCIpCgpgYGAKCgoKYGBge3J9CgpkZjEgPC0gZnVsbF9qb2luKGQxLGQxLGJ5PWNoYXJhY3RlcigpLHN1ZmZpeCA9IGMoIiIsICIueSIpKSAlPiUgZmlsdGVyKHQgIT0gdC55KSAlPiUgbXV0YXRlKHAuZGlzdD1hYnMocHJvcC5zIC0gcHJvcC5zLnkpKQoKCnAubWF0Y2hlcyA8LSBOVUxMCiMgbS5tYXRjaGVzIDwtIE5VTEwKcC5pZHMgPC0gbGlzdChpZHg9TlVMTCxpZHgueT1OVUxMKQojIG0uaWRzIDwtIGxpc3QoaWQ9TlVMTCxzX2lkPU5VTEwpCgpmb3IgKGkgaW4gMToobnJvdyhkZjEpKSkgewogICAgCiAgICBpZiAobnJvdyhkZjEgJT4lIGZpbHRlcighaWR4LnkgJWluJSBwLmlkcyRpZHgueSwgIWlkeCAlaW4lIHAuaWRzJGlkeCkpIT0wKSB7CiAgICAKICAgIHAgPC0gZGYxICU+JSBmaWx0ZXIoIWlkeC55ICVpbiUgcC5pZHMkaWR4LnksICFpZHggJWluJSBwLmlkcyRpZHgpICU+JSAKICAgICAgICAgIGZpbHRlcihwLmRpc3QgPT0gbWluKHAuZGlzdCkpIAogICAgcC5tYXRjaGVzIDwtIHJiaW5kKHAubWF0Y2hlcywgcCkKICAgIHAuaWRzIDwtIHAubWF0Y2hlc1tjKCJpZHgiLCAiaWR4LnkiKV0KICAgIAogICAgIyBtIDwtIGRmMyAlPiUgZmlsdGVyKCFzX2lkICVpbiUgbS5pZHMkc19pZCwgIWlkICVpbiUgbS5pZHMkaWQpICU+JSAKICAgICMgICAgICAgZmlsdGVyKG0uZGlzdCA9PSBtaW4obS5kaXN0KSkgCiAgICAjIG0ubWF0Y2hlcyA8LSByYmluZChtLm1hdGNoZXMsIG0pCiAgICAjIG0uaWRzIDwtIG0ubWF0Y2hlc1tjKCJpZCIsICJzX2lkIildCiAgICB9CiAgICAKfQoKCmRtIDwtIGFzLm1hdHJpeChwLm1hdGNoZXNbLGMoJ3gxJywneDInKV0tcC5tYXRjaGVzWyxjKCd4MS55JywneDIueScpXSkKCiNjb3ZhcmlhbmNlIG1hdHJpeApjIDwtIGNvdihkMVssYygneDEnLCd4MicpXSkKCiMgc29sdmUgIChjb3ZhcmlhbmNlIG1hdHJpeCkgJSolIHggPSBkIGZvciB4CmNvdi5kIDwtIHNhcHBseSgxOm5yb3cocC5tYXRjaGVzKSwgZnVuY3Rpb24oeCkgc29sdmUoYyxkbVt4LF0pKSAlPiUgdCgpCgojIE1haGFsYW5vYmlzIGNhbGN1bGF0aW9uIGZvcmNlZCBpbiB0d28gc3RlcHMKcC5tYXRjaGVzJG0uZGlzdCA8LSBhcHBseShkbSpjb3YuZCwgMSwgc3VtKQoKCnAubWF0Y2hlcyAlPiUgcm93d2lzZSgpICU+JSAKICAgIG11dGF0ZShhPXgxLXgxLnksIGI9eDIteDIueSwKICAgICAgICAgICBtLmQgPSBzdW0oYyhhLGIpKnNvbHZlKGNvdihkMVssYygneDEnLCd4MicpXSksIGMoYSxiKSkpKSAlPiUgc2VsZWN0KC1hLCAtYikKCgpgYGAKCgoKYGBge3J9CgojIGpvaW4oZDEscC5tYXRjaGVzLCIiKQoKZXN0cyA8LSBOVUxMCmIgPC0gTlVMTAoKZm9yIChpIGluIHNlcSgxLChucm93KHAubWF0Y2hlcyktOSksYnk9MikpewogICAgCiAgICBkYXRhIDwtIHAubWF0Y2hlcyAlPiUgYXJyYW5nZShkZXNjKHAuZGlzdCksdCkgJT4lIC5baTpucm93KHAubWF0Y2hlcyksXQogICAgCiAgICBiYWxzIDwtIGJhbC50YWIodCB+IHgxICsgeDIsIGRhdGEgPSBkYXRhLCAKICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9ICJwcm9wLnMiLCBzLmQuZGVub20gPSAidHJlYXRlZCIpCgogICAgYiA8LSByYmluZChiLGxpc3QoeDEuYmFsID0gYmFscyRCYWxhbmNlWzIsMl0sIHgyLmJhbCA9IGJhbHMkQmFsYW5jZVsxLDJdKSAlPiUgCiAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkpCiAgICAKICAgIGYxLmwgPC0gbGFwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kYXRhKSkKICAgIAogICAgIyBmMS5zIDwtIHNhcHBseShmMS50LGZ1bmN0aW9uKHgpIGxtKHgsIGRhdGE9ZDEsIHdlaWdodHM9IGQxJHByb3Aud3QpKQogICAgCiAgICAjIGYxLmxbWzk4XV0KICAgIAogICAgZjEuZXN0IDwtIHNhcHBseSgxOmxlbmd0aChmMS5sKSwgZnVuY3Rpb24oeCkgZjEubFtbYyh4LDEsMildXSkKICAgIAogICAgZXN0cyA8LSByYmluZChlc3RzLGNiaW5kKG49aSx2YXJpYW5jZT12YXIoZjEuZXN0KSwgbWF4PW1heChmMS5lc3QpLCBhdj1tZWFuKGYxLmVzdCkpKQoKfQoKZXN0cyA8LSBlc3RzICU+JSBhcy5kYXRhLmZyYW1lKCkKb3V0cHV0IDwtIG91dHB1dCAlPiUgYXMuZGF0YS5mcmFtZSgpCgpjb2xuYW1lcyhvdXRwdXQpPC0gYygibW9kZWwiLCAidmFycyIsICJtYXgudmFsIiwgImF2IikKCm91dHB1dCR2YXJzIDwtIG91dHB1dCR2YXJzICU+JSBhcy5udW1lcmljKCkKCm91dHB1dCRtYXgudmFsIDwtIG91dHB1dCRtYXgudmFsICU+JSBhcy5udW1lcmljKCkKCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocC5tYXRjaGVzLCBhZXMoeDEseDIsIGNvbG9yID0gYXMuZmFjdG9yKHQpKSkgKyAKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW49MCwgeG1heD01LCB5bWluPTAsIHltYXg9NSwgYWxwaGE9MC4xLCBmaWxsPSJibHVlIikgKyAKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW49MSwgeG1heD02LCB5bWluPTEsIHltYXg9NiwgYWxwaGE9MC4xLCBmaWxsPSJyZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibHVlIiwgInJlZCIpLCBuYW1lPSJHcm91cCIsIGxhYmVscyA9IGMoIkNvbnRyb2wiLCJUcmVhdCIpKSArCiAgZ2VvbV9zZWdtZW50KGRhdGE9cC5tYXRjaGVzW3AubWF0Y2hlcyR0PT0wLF0sCiAgICAgICAgICAgICAgIGFlcyh4PXgxLHhlbmQ9eDEueSx5PXgyLHllbmQ9eDIueSwgCiAgICAgICAgICAgICAgICAgICBhbHBoYT1jdXQocmFuayhwLmRpc3QpLDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoMSwyLDMsNCkpKSwgCiAgICAgICAgICAgICAgIGNvbG9yPSAiYmxhY2siLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMC4yLCJjbSIpKSkgKwogICAgc2NhbGVfYWxwaGFfZGlzY3JldGUobmFtZT0iQ3V0cyIsIGxhYmVscz1jKCIxc3QiLCAiMm5kIiwgIjNyZCIsICI0dGgiKSwgcmFuZ2UgPSBjKDEsMC4xKSkgKwogIGdlb21fcG9pbnQoKSArIHRoZW1lX2NsYXNzaWMoKSAKCgpnZ3Bsb3QocC5tYXRjaGVzW3AubWF0Y2hlcyR0PT0wLF0sIGFlcyhwcm9wLnMscHJvcC5zLnksIGNvbG9yPXAuZGlzdCkpICsgCiAgZ2VvbV9hYmxpbmUoc2xvcGU9MSkgKyBnZW9tX3BvaW50KCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsaW1zKHg9YygwLDEpLHk9YygwLDEpKSAKCmdncGxvdChwLm1hdGNoZXNbcC5tYXRjaGVzJHQ9PTAsXSwgYWVzKHByb3Aucyxwcm9wLnd0LCBjb2xvcj1wcm9wLnN0KSkgKyAKIGdlb21fcG9pbnQoYWxwaGE9MC43KSArIHRoZW1lX2NsYXNzaWMoKSMgKyBsaW1zKHg9YygwLDEpLHk9YygwLDEpKSAKCmdncGxvdChwLm1hdGNoZXNbcC5tYXRjaGVzJHQ9PTAsXSwgYWVzKHAuZGlzdCwgbS5kaXN0LCBjb2xvcj1wcm9wLnN0KSkgKyAKIGdlb21fcG9pbnQoYWxwaGE9MC43KSArIHRoZW1lX2NsYXNzaWMoKSMgKyBsaW1zKHg9YygwLDEpLHk9YygwLDEpKSAKCmdncGxvdChwLm1hdGNoZXNbcC5tYXRjaGVzJHQ9PTAsXSwgYWVzKHByb3AucyxtLmRpc3QsIGNvbG9yPXByb3Auc3QpKSArIAogZ2VvbV9wb2ludChhbHBoYT0wLjcpICsgdGhlbWVfY2xhc3NpYygpIyArIGxpbXMoeD1jKDAsMSkseT1jKDAsMSkpIAoKYGBgCgoKCgpgYGB7cn0KCmdnYXJyYW5nZSgKZ2dwbG90KGVzdHMsIGFlcyhuLCB2YXJpYW5jZSkpICsgZ2VvbV9saW5lKCkgKyAKICAgIGdlb21faGxpbmUoZGF0YSA9IG91dHB1dCwgYWVzKHlpbnRlcmNlcHQ9dmFycywgY29sb3I9bW9kZWwpKSArCiAgICBsYWJzKHg9Ik51bWJlciBvZiB1bml0cyByZW1vdmVkIiwgeT0iQXZlcmFnZSBlc3RpbWF0ZSB2YXJpYW5jZSIpLAoKZ2dwbG90KGVzdHMsIGFlcyhuLCBtYXgpKSArIGdlb21fbGluZSgpICsgCiAgICBnZW9tX2hsaW5lKGRhdGEgPSBvdXRwdXQsIGFlcyh5aW50ZXJjZXB0PW1heC52YWwsIGNvbG9yPW1vZGVsKSkgKwogICAgbGFicyh4PSJOdW1iZXIgb2YgdW5pdHMgcmVtb3ZlZCIsIHk9Ik1heGltdW0gZXN0aW1hdGUiKSwKCmdncGxvdChlc3RzLCBhZXMobiwgYXYpKSArIGdlb21fbGluZSgpICsgCiAgICBnZW9tX2hsaW5lKGRhdGEgPSBvdXRwdXQsIGFlcyh5aW50ZXJjZXB0PWFzLm51bWVyaWMoYXYpLCBjb2xvcj1tb2RlbCkpICsgCiAgICBsYWJzKHg9Ik51bWJlciBvZiB1bml0cyByZW1vdmVkIiwgeT0iQXZlcmFnZSBlc3RpbWF0ZSIpLApjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gImJvdHRvbSIKKSAlPiUgYW5ub3RhdGVfZmlndXJlKHRvcCA9ICJPdXRwdXQgZm9yIDUxMiBtb2RlbHMgaW5jbHVkaW5nIHNlY29uZCBhbmQgdGhpcmQgb3JkZXIgaW50ZXJhY3Rpb25zIikKCmBgYAoKCmBgYHtyfQoKIyBjb3ZzIDwtIHN1YnNldChwLm1hdGNoZXMsIHNlbGVjdCA9IGMoeDEsIHgyLCB0KSkKIyAKIyBiYWwudGFiKGNvdnMsIHRyZWF0ID0gcC5tYXRjaGVzJHQpCiMgYmFsLnRhYihjb3ZzLCB0cmVhdCA9IHAubWF0Y2hlcyR0LCB3ZWlnaHRzID0gcC5tYXRjaGVzJHByb3Aud3QpCgojIGJhbHMgPC0gYmFsLnRhYih0IH4geDEgKyB4MiwgZGF0YSA9IHAubWF0Y2hlcywgZGlzdGFuY2UgPSAicHJvcC5zIiwgcy5kLmRlbm9tID0gInRyZWF0ZWQiKQoKIyBiYWxzJEJhbGFuY2VbYygyOm5yb3coYmFscyRCYWxhbmNlKSksMl0KCmJhbC53dCA8LSBiYWwudGFiKHQgfiB4MSArIHgyLCBkYXRhID0gcC5tYXRjaGVzLCB3ZWlnaHRzID0gInByb3Aud3QiLAogICAgICAgIGRpc3RhbmNlID0gInByb3AucyIsIHMuZC5kZW5vbSA9ICJ0cmVhdGVkIiwgdW5iYWw9VCkkQmFsYW5jZQoKIyAgICAgICAgICAgIFR5cGUgRGlmZi5BZGoKIyBwcm9wLnMgRGlzdGFuY2UgICAwLjA2OTEKIyB4MSAgICAgIENvbnRpbi4gICAwLjA1MjkKIyB4MiAgICAgIENvbnRpbi4gICAwLjA5MzIKCgpiYWwuc3RyYXQgPC0gYmFsLnRhYih0IH4geDEgKyB4MiwgZGF0YSA9IHAubWF0Y2hlcywgc3ViY2xhc3MgPSAicHJvcC5zdCIsCiAgICAgICAgZGlzdGFuY2UgPSAicHJvcC5zIiwgcy5kLmRlbm9tID0gInRyZWF0ZWQiLCAKICAgICAgICB3aGljaC5zdWJjbGFzcyA9IC5hbGwsIHN1YmNsYXNzLnN1bW1hcnkgPSBUUlVFKSRCYWxhbmNlCgpgYGAKCgoKCgpgYGB7cn0KCmdnYXJyYW5nZSgKZ2dwbG90KGIsIGFlcyh4PXJvdyhiKVssMV0pKSArIGdlb21fbGluZShhZXMoeT14MS5iYWwsIGNvbG9yPSJNYXRjaGVkIikpICsKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9YmFsLnd0WzIsM10sIGNvbG9yPSJXZWlnaHRlZCIpLCApICsKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9YmFsLnN0cmF0WzIsM10sIGNvbG9yPSJTdHJhdGlmaWVkIikpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsKICAgIGdlb21fcmliYm9uKGFlcyh5bWluPS0wLjEseW1heD0wLjEpLCBhbHBoYT0wLjIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICJkYXJrYmx1ZSIsICJibHVlIiksIAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiTWV0aG9kIikgKyBsYWJzKHRpdGxlPSJ4MSIseD0iIix5PSIiKSwKZ2dwbG90KGIsIGFlcyh4PXJvdyhiKVssMV0pKSArIGdlb21fbGluZShhZXMoeT14Mi5iYWwsIGNvbG9yPSJ4MiBNYXRjaCIpKSArIAogICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1iYWwud3RbMywzXSwgY29sb3I9IngyIFd0IikpICsKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9YmFsLnN0cmF0WzMsM10sIGNvbG9yPSJ4MiBTdHJhdCIpKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbj0tMC4xLHltYXg9MC4xKSwgYWxwaGE9MC4yKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiYmx1ZSIsICJkYXJrcmVkIiksIAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiQ292YXJpYXRlIikgKyBsYWJzKHRpdGxlPSJ4MiIseD0iIix5PSIiKSwKY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJ0b3AiCgopICU+JSBhbm5vdGF0ZV9maWd1cmUodG9wID0gIkNvdmFyaWF0ZSBiYWxhbmNlIGJ5IGRpZmZlcmVuY2UgaW4gc3RhbmRhcmlzZWQgbWVhbnMiLCAKICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSAiU3RhbmRhcmRpc2VkIG1lYW4gZGlmZmVyZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICBib3R0b20gPSAiTnVtYmVyIG9mIHBhaXJzIHJlbW92ZWQiKQpgYGAKCgpgYGB7cn0KIyBmb3IgKGkgaW4gMToyMDApIHsKIyBzYXBwbHkoMjAwLCBmdW5jdGlvbih4KSBmb3IoaSBpbiAxOngpIHttZWFuKHJub3JtKDIwMCkpfSkKIyB9CmBgYAoKCgpgYGB7cn0KZGlzdGFuY2UgPC0gZml0dGVkKGdsbSh0cmVhdH5hZ2UrZWR1YyxsYWxvbmRlLCBmYW1pbHk9ImJpbm9taWFsIikpCgpzcHJvYnMgPC0gc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSByb3VuZCg2KSArIDEpCgpxdWFudGlsZShkaXN0YW5jZVtsYWxvbmRlJHRyZWF0PT0xXSwgcHJvYnMgPSBzcHJvYnMsIG5hLnJtID0gVFJVRSkKCmBgYAoKCmBgYHtyfQptYXRjaCA8LSBtYXRjaGl0KHRyZWF0fmFnZStlZHVjLCBsYWxvbmRlLCBkaXN0YW5jZSA9ICJtYWhhbGFub2JpcyIgLCByZXBsYWNlID0gVCwgbS5vcmRlciA9ICJkYXRhIikKIyBzdW1tYXJ5KG1hdGNoKQoKbWF0Y2gub3V0IDwtIG1hdGNoLmRhdGEobWF0Y2gpCiMgc3VtbWFyeShtYXRjaC5vdXQpCgojIGdncGxvdChtYXRjaC5vdXQsIGFlcyhlZHVjLCBhZ2UpKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHRyZWF0KSkpICsgZ2VvbV9saW5lKGFlcyhncm91cD1zdWJjbGFzcykpCgpkLm1hdHJpeCA8LSBvcHRtYXRjaDo6bWF0Y2hfb24oZGlzdGFuY2UsIHo9bGFsb25kZSR0cmVhdCwgc3RhbmRhcmRpemF0aW9uLnNjYWxlPTEpCmQubWF0cml4IDwtIG9wdG1hdGNoOjptYXRjaF9vbihtYXRjaCRmb3JtdWxhLCBkYXRhID0gbGFsb25kZSwgbWV0aG9kID0gIm1haGFsYW5vYmlzIikKZC5tYXRyaXgyIDwtIG9wdG1hdGNoOjptYXRjaF9vbihtYXRjaCRmb3JtdWxhLCBkYXRhID0gbGFsb25kZSwgbWV0aG9kID0gIm1haGFsYW5vYmlzIiwgc3RhbmRhcmRpemF0aW9uLnNjYWxlPTEpCgoKbWF0IDwtICBkaXN0Lm1hdGNoZXMoZC5tYXRyaXgsIHJlcGxhY2UgPSBULCBvcmRlciA9ICJkYXRhIikKCgptYXQgJT4lIAoKIyBtYXRjaCRtYXRjaC5tYXRyaXg9PWFzLm1hdHJpeChtYXRbWydjb250cm9sJ11dKQoKIyBjYmluZChtYXQsIG1hdGNoaXQgPSBtYXRjaCRtYXRjaC5tYXRyaXgpICU+JSBmaWx0ZXIoY29udHJvbCE9bWF0Y2hpdCkKCmxhbG9uZGVbbWF0JHRyZWF0bWVudCxdCmxhbG9uZGVbbWF0JGNvbnRyb2wsXQoKY2JpbmQodD1sYWxvbmRlW21hdCR0cmVhdG1lbnQsXSwgYz1sYWxvbmRlW21hdCRjb250cm9sLF0sbWF0KSAlPiUgZGltKCkKCgpkYXRhLmZyYW1lKElEcz1jKG1hdCR0cmVhdG1lbnQsIG1hdCRjb250cm9sKSkgJT4lICBzdW1tYXJpc2UobklEcz1uKCksIC5ncm91cHMgPSBJRHMpCgp0KHRhYmxlKGMobWF0JHRyZWF0bWVudCwgbWF0JGNvbnRyb2wpKSkgJT4lIGRpbSgpCgp0YWJsZShtYXQkY29udHJvbClbbWF0JGNvbnRyb2xdICU+JSBkaW0oKQpgYGAKCgoKYGBge3J9CgpkaXN0KCkKCmBgYAoK